<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>数据类型</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script>
        window.onload = function(){
        
            /*
            JS 中六大类型
            1.String
            2.Number
            3.Boolean
            4.undefined
            5.Object
            6.Function
            */

            /*
            JS中三大引用类型
            1.Array - Object 子类型
            2.Object
            3.Function - Function 类型,但 Function实例属于Object类型
            */

            var str = 'abc';
            var num = 123;
            var bool = true;
            var und = undefined;

            var n = null;
            var arr = [];
            var obj = {};

            var fun = function(){};
            console.log(typeof fun);

            //三大引用类型
            /** 引用-1.Array 类型 */
            // 第一种使用 array 构造函数
            var arr1 = new Array();
            arr1[0] = 'a';
            arr1[1] = 'b';
            var arr2 = new Array('x','y','z');

            //第二种使用：字面量表示法
            var arr3 = ['red','blue','yellow'];//数组用中括号[],对象用大括号 {}

            /* 引用-.Object 类型*/
            //第一种object构造函数
            var person = new Object();
            person.name = 'Hanley';
            person['age'] = 18;
            console.log(person);

            //第二种 字面量（简单字面量/嵌套字面量）
            //1）简单字面量
            var person2 = {};
            person2.name = 'Jack';
            person2.action = function(){
                console.log(this.name);
            };

            //2) 嵌套字面量,key:value  
            // 一般情况key 不用加引号,若有空格或者减号，需要加引号
            // 当然也可以全部加引号，单引号或双引号在前端没有区别
            // 注意JSON格式数据 key 必须有双引号，但这里单双没有区别
            var person3 = {
                name:'Rose',
                age:20,
                action:function(){
                    console.log(this.name);
                }
            };

            //3）第三种(拓展) 工厂方式
            function createObj(name){
                var obj1 = new Object();
                obj1.name = name;
                obj1.showName = function () {
                   console.log(this.name);
                }
                return obj1;
            };
            var p = createObj("Hanley");
            p.showName();

             //4）第四种(拓展) 构造函数
             //首字母大写，使用驼峰命名
             function CreateObj2(name){
                 this.name = name;
                 this.showName = function(){
                     console.log(this.name);
                 }
             }
             var p2 = new CreateObj2('小米');
             p2.showName();

             //引用-3 function类型
             //函数声明,调用代码无论在 函数位置前后都可以调用的到
             function sum(n1,n2) {
                 return n1 + n2;
             }
             //函数表达式,只能在 表达式下方才可以调用; 
             var sum2 = function(n1,n2){
                 return n1 + n2;
             }



            //值类型 与 引用类型 区别

        };
    </script>
</head>


<body>
    
</body>
</html>